// 动作的处理函数，也即状态的更新函数–redux.js

// createStore方法是用来创建store的，combineReducers方法是用来合并多个reducer的
import {combineReducers, createStore} from 'redux';
import {ACTION_LOGIN, SiderCollpased, GetSiderData, SiderOnOpenChange, AddTabs} from "./actionType";


// 定义reducer，第一个参数为state，赋予默认值// 第二个参数为action，
// reducer负责响应Action修改state值
const getLoginFun = (state = {count: 1}, action) => {
    switch (action.type) {
        case ACTION_LOGIN:
            return {...state, ...action}
        default:
            return state
    }
};


const siderInitializeState = {
    collapsed: false,
    openKey: [],
    siderList: [],
    rootSiderKeys: []
}
const siderFunc = (state = siderInitializeState, action) => {
    console.log("-------------------------store/index-------------------");
    switch (action.type) {
        case SiderCollpased:
            return {...state, collapsed: !state.collapsed}
        case GetSiderData:
            return {...state, ...action}
        case SiderOnOpenChange:
            return {...state, ...action}
        default:
            return state
    }
};

const tabsInitializeState = {panes: []}
const tabsFunc = (state = tabsInitializeState, action) => {
    switch (action.type) {
        case AddTabs: {
            if (state.panes.indexOf(action.item) === -1) {
                state.panes.push(action.item)
            }
            console.log(state);
            return {...state}
        }

            // state.panes.indexOf(action.item) === -1 ? state.panes.push(action.item) : state.panes;
            // return {...state, panes: state.panes}
        default:
            return state
    }
}



// 创建根reducer，利用combineReducers合并多个reducer，此处还未定义reducer，所以暂空
const rootReducer = combineReducers({
    getLogin: getLoginFun,
    sider: siderFunc,
    tabs: tabsFunc
})

// 创建初始化的state，初始化为一个空对象即可，默认的数据建议都写在reducer上
const initializeState = {}; // 定义初始化的state

// 创建store，第一个参数是根reducer，第二个参数可以是初始化的state，也可以是别的，暂且不提
const store = createStore(
    rootReducer,
    initializeState
);

export default store;

// 1. 中间件（middleware）介绍
// 中间就是在action与reducer之间又加了一层，没有中间件的Redux的过程是：action -> reducer，
// 而有了中间件的过程就是action -> middleware -> reducer，
// 使用中间件我们可以对action也就是对dispatch方法进行装饰，
// 我们可以用它来实现异步action、打印日志、错误报告等功能。
// 又是装饰器，没错，这块的好多东西都离不开装饰器模式，所以，设计模式很重要。

// 2. Redux中间件的使用
// 通过thunk中间件，我们就可以实现异步的action了。
//
// export function addAsync(){
//     return dispatch => {
//         setTimeout(() => {
//             dispatch(add())
//         }, 2000);
//     }
// }
// 想要实现中间件，我们首先有两个任务要做：
//
// 扩展createStore方法，使它可以接收第二个参数。
//
// applyMiddleware方法的实现。

